gdk: Keep track of the last slave device used
authorCarlos Garnacho <carlosg@gnome.org>
Sat, 3 Dec 2011 14:04:19 +0000 (15:04 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 23 Feb 2012 21:45:29 +0000 (16:45 -0500)
This last slave device (stored per master) is used to fill
in the missing slave device in synthesized crossing events
that are not directly caused by a device event (ie due to
configure events or grabs).

gdk/gdkdisplayprivate.h
gdk/gdkwindow.c
gdk/x11/gdkdisplay-x11.c

index 2c7b511cc13224c4ac208f7e56fb8d548ddc07e2..8084332c2c48a20cb56755aa249b9ce34a4152a1 100644 (file)
@@ -75,6 +75,7 @@ typedef struct
   gdouble toplevel_x, toplevel_y;
   guint32 state;
   guint32 button;
+  GdkDevice *last_slave;
 } GdkPointerWindowInfo;
 
 typedef struct
index bcbd335a5ac16091739aa605ae538d571d971d5d..ed39799b0a6ee61fd1d310630a7401e77c4ffb4b 100644 (file)
@@ -9045,7 +9045,7 @@ do_synthesize_crossing_event (gpointer data)
               _gdk_synthesize_crossing_events (display,
                                                pointer_info->window_under_pointer,
                                                new_window_under_pointer,
-                                               device, NULL,
+                                               device, pointer_info->last_slave,
                                                GDK_CROSSING_NORMAL,
                                                pointer_info->toplevel_x,
                                                pointer_info->toplevel_y,
@@ -9571,6 +9571,17 @@ _gdk_windowing_got_event (GdkDisplay *display,
     {
       GdkInputMode mode;
 
+      pointer_info = _gdk_display_get_pointer_info (display, device);
+
+      if (pointer_info)
+        {
+          if (source_device != pointer_info->last_slave &&
+              gdk_device_get_device_type (source_device) == GDK_DEVICE_TYPE_SLAVE)
+            pointer_info->last_slave = source_device;
+          else
+            source_device = pointer_info->last_slave;
+        }
+
       g_object_get (device, "input-mode", &mode, NULL);
       _gdk_display_device_grab_update (display, device, source_device, serial);
 
@@ -9589,8 +9600,6 @@ _gdk_windowing_got_event (GdkDisplay *display,
   if (!event_window)
     return;
 
-  pointer_info = _gdk_display_get_pointer_info (display, device);
-
 #ifdef DEBUG_WINDOW_PRINTING
   if (event->type == GDK_KEY_PRESS &&
       (event->key.keyval == 0xa7 ||
index 897d713c25c191ec62d0d85fc6761294d0cdc162..ae6896c7abc5da673a76b7051d832d94173cfd27 100644 (file)
@@ -1579,9 +1579,12 @@ device_grab_update_callback (GdkDisplay *display,
                              gpointer    data,
                              gulong      serial)
 {
+  GdkPointerWindowInfo *pointer_info;
   GdkDevice *device = data;
 
-  _gdk_display_device_grab_update (display, device, NULL, serial);
+  pointer_info = _gdk_display_get_pointer_info (display, device);
+  _gdk_display_device_grab_update (display, device,
+                                   pointer_info->last_slave, serial);
 }
 
 #define XSERVER_TIME_IS_LATER(time1, time2)                        \